﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Clases;
using Sistema_Totem.Clases.Fabricas;
using Sistema_Totem.Acceso_a_Datos.FabricaDAOS;
using System.Xml;
using System.Collections;
using Sistema_Totem.Logica.Exepciones_Logica;

namespace Sistema_Totem.Logica.Comandos.ComandoRequerimiento
{
    public class ComandoConsultarRequerimiento : Comando<List<Requerimiento>>
    {
        #region Atributos
        /// <summary>
        /// Atributos
        /// </summary>
        private int _IdProyecto;

        #endregion Atributos

        #region Constructor

        /// <summary>
        /// 
        /// </summary>
        /// <param name="_requerimiento"></param>
        public ComandoConsultarRequerimiento(int idProyecto)
          {
              Entidad _req = FabricaEntidad.NuevoRequerimiento();
              (_req as Requerimiento).IdProyecto = idProyecto;
              this._IdProyecto = idProyecto;
          }

        #endregion Constructor

        #region Metodos

        /// <summary>
        /// implementacion del metodo ejecutar del comando concreto
        /// </summary>
        /// <returns></returns>
        public override List<Requerimiento> Ejecutar()
        {
            // Listas auxiliares del tipo de la clase Requerimiento
            List<Requerimiento> listaRequerimiento = new List<Requerimiento>();
            List<Requerimiento> listaReque = new List<Requerimiento>();
            try
            {
                this.Entidad = FabricaEntidad.NuevoRequerimiento();
                // hacemos una instancia del DaoDocumentoRequerimiento
                listaRequerimiento = FabricaDAO.CrearFabricaDeDAO(1).CrearDAODocumentoRequerimiento().
                                     ConsultarRequerimiento(this._IdProyecto);
                // Recorremos la lista de requerimientos
                foreach (Requerimiento req in listaRequerimiento)
                {
                    this.Entidad = ConsultarDRequerimiento(req.Contenido, req.Id);
                    listaReque.Add(this.Entidad as Requerimiento);
                }
            }
            catch (NullReferenceException exceptionXML)
            {
                throw (new RequerimientoExcepcion("Error, la devolucion del objeto es null", exceptionXML));
            }
            return listaReque;
        }

        #region Consultar Documento Requerimiento

        /// <summary>
        /// Método que consulta la Plantilla del Documento 
        /// Reuqerimiento.
        /// </summary>
        /// <param name="plantillaReq"></param>
        /// <returns></returns>
        public Requerimiento ConsultarDRequerimiento(XmlDocument plantillaReq, int idReq)
        {
            try
            {
                this.Entidad = FabricaEntidad.NuevoRequerimiento();
                XmlDocument xmlReq = plantillaReq;
                XmlNodeList plantilla = xmlReq.GetElementsByTagName("DOCUMENTO");
                XmlNodeList referencia =
                    ((XmlElement)plantilla[0]).GetElementsByTagName("REFERENCIAS");
                XmlNodeList seccion =
                    ((XmlElement)plantilla[0]).GetElementsByTagName("SECCION");
                XmlNodeList titulo =
                    ((XmlElement)plantilla[0]).GetElementsByTagName("TITULO");
                XmlNodeList listElement =
                    ((XmlElement)plantilla[0]).GetElementsByTagName("ELEMENTO");
                Seccion _miSeccion = new Seccion();
                _miSeccion.ListaControl = new List<ElementoControl>();

                foreach (XmlElement nodo in seccion)
                {
                    _miSeccion.Nombre = nodo.Value;
                    foreach (XmlElement nodoElemento in listElement)
                    {
                        int i = 0;
                        ElementoControl _elemento = new ElementoControl();
                        XmlNodeList nombre =
                           nodoElemento.GetElementsByTagName("NOMBRE");
                        _elemento.Nombre = nombre[i].InnerText;
                        XmlNodeList tipo =
                           nodoElemento.GetElementsByTagName("TIPO");
                        _elemento.Tipo = tipo[i].InnerText;
                        XmlNodeList estado =
                           nodoElemento.GetElementsByTagName("ESTADO");
                        _elemento.Estado = estado[i].InnerText;
                        XmlNodeList contenido =
                           nodoElemento.GetElementsByTagName("CONTENIDO");
                        _elemento.Contenido = contenido[i++].InnerText;
                        _miSeccion.ListaControl.Add(_elemento);
                    }
                    (this.Entidad as Requerimiento).ListaSeccion.Add(_miSeccion);
                    (this.Entidad as Requerimiento).Id = idReq;
                }
            }
            catch (XmlException exceptionXML)
            {
                throw (new RequerimientoExcepcion("Error al leer el XML de Requerimiento", exceptionXML));
            }
            return (this.Entidad as Requerimiento);
        }

        #endregion Consultar Documento Requerimiento

        #endregion Metodos
    }

}